#include "../header.h"
/**
 * @函数原型:  int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);
 * @函数功能: 同时监控多路文件描述符 是否有数据变化。
 * @参数说明: 
 * @       参数1: nfds : 最大文件描述符 数值 + 1 ； 
 * @       参数2: readfds ： 输入文件描述符集合。
 * @       参数3: writefds ： 输出文件描述符集合。
 * @       参数4: exceptfds ： 异常错误文件描述符集合。 
 * @       参数5: timeout ： 超时时间。
 * @返回值: 已经准备好的文件描述符个数。 0 。 如果出错  -1； 
 * @param {int} argc
 */
//1 监控集合内的所有文件描述符。
//2 有限定时间，超时会返回。
//3 select有阻塞现象。
//4 select继续向下执行的条件： 超时   有文件描述符所对应的设备数据发生了变化。
//5 每调用一次select都要重新填写超时时间。
//对文件描述符集合进行操作的子函数
// FD_CLR(int fd,fd_set* set)；删除描述符数组中的fd。
// FD_ISSET(int fd,fd_set *set)；判断描述符数组中的fd是否有数据变化。
// FD_SET（int fd,fd_set*set）；向文件描述符集合中添加某文件描述符
// FD_ZERO（fd_set *set）；清除全部文件描述符。

//单独测试 select的用法
//只监控一个文描述符
int main(int argc, char const *argv[])
{
    //输入文件描述符集合
    fd_set rset = {0};
    //设定超时时间。
    struct timeval tm = {0};
    char bufs[128] = "";
    //文件描述符个数
    int count = 0 ;
    while(strncmp(bufs,"quit",4))
    {
        //把本应用程序关心的文件描述符进行分类，并且添加进相关的文件描述符集合当中。
        FD_SET(STDIN_FILENO,&rset);
        //超时时间3秒钟。
        tm.tv_sec = 3;
        count = select(STDIN_FILENO + 1,&rset,NULL,NULL,&tm);
        printf("时间到!:count = %d\n",count);
        //如果数据立即发生了变化，立即响应。
        //发生数据变化的文件描述符正好是  输入文件描述符中的成员。
        //判断成功返回1
        if(FD_ISSET(STDIN_FILENO,&rset))
        {
            printf("键盘有数据变化!\n");
            bzero(bufs,sizeof(bufs));
            read(STDIN_FILENO,bufs,sizeof(bufs));
            printf("从键盘读到的数据是:%s\n",bufs);
        }

    }
    return 0;
}
